package br.com.felipeab.dexter.util;

import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;

import javax.faces.context.FacesContext;

import com.sun.faces.application.ApplicationAssociate;
import com.sun.faces.application.ApplicationResourceBundle;

/**
 * Classe BundleHelper, classe para trabalhar com Resource Bundle.
 * 
 * @author Felipe A. Braga<br>
 *         24/09/2012
 */
public class BundleHelper {

	/**
	 * Obtém o arquivos do message-bundle
	 */
	private static ResourceBundle resourceBundle;
	private static Set<ResourceBundle> bundles;

	private BundleHelper() {
	}

	private static void mountResourceBundle() {
		// FIXME Necessário procurar se o jeito encontrado de localizar os
		// bundles é o melhor.
		FacesContext facesContext = FacesContext.getCurrentInstance();
		Map<String, ApplicationResourceBundle> map = ApplicationAssociate.getCurrentInstance().getResourceBundles();
		Iterator<?> iterator = map.keySet().iterator();

		bundles = new HashSet<ResourceBundle>();

		while (iterator.hasNext()) {
			bundles.add(facesContext.getApplication().getResourceBundle(facesContext, String.valueOf(iterator.next())));
		}
	}

	/**
	 * Obtém mensagem do bundle, pelo chave enviado.
	 * 
	 * @param messageKey
	 * @return a mensagem contida na chave
	 */
	public static String getMessage(String messageKey) {
		mountResourceBundle();
		messageKey = messageKey.trim();
		Iterator<ResourceBundle> iterator = bundles.iterator();
		while (iterator.hasNext()) {
			resourceBundle = iterator.next();
			if (resourceBundle.containsKey(messageKey)) {
				return resourceBundle.getString(messageKey);
			}
		}
		return resourceBundle.getString(messageKey);
	}

	/**
	 * Obtém mensagem do bundle montando com parametros
	 * 
	 * @param messageKey
	 * @param parametros
	 * @return a mensagem contida na chave, montada com seus respectivos
	 *         parametros
	 */
	public static String getMessageWithParam(String messageKey, Object... parametros) {
		return MessageFormat.format(getMessage(messageKey), parametros);
	}
}

